home *** CD-ROM | disk | FTP | other *** search
/ Experimental BBS Explossion 3 / Experimental BBS Explossion III.iso / c / font_cmp.zip / $FONT.C next >
Text File  |  1993-10-25  |  7KB  |  157 lines

  1. /* Graphic font functions */
  2.  
  3. //#include <stdio.h>
  4.  
  5. #define FONT_LETTERS 95
  6. #define NULL 0
  7.  
  8. void text(int x, int y, char * str);
  9. void print_letter(int x, int y, char letter);
  10.  
  11.  
  12. /* To find what font array element to use, subtract 32 from */
  13. /* the character's ASCII value (after checking for NULL) */
  14.  
  15. unsigned char font[FONT_LETTERS][7] = {  // 7 = max height
  16.   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Space
  17.   { 0x80, 0x80, 0x80, 0x80, 0x00, 0x80, 0x00 }, // !
  18.   { 0xA0, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00 }, // "
  19.   { 0x48, 0xFC, 0x48, 0x48, 0xFC, 0x48, 0x00 }, // #
  20.   { 0x40, 0x60, 0x80, 0x40, 0x20, 0xC0, 0x40 }, // $
  21.   { 0xC4, 0xC8, 0x10, 0x20, 0x4C, 0x8C, 0x00 }, // %
  22.   { 0x40, 0xA0, 0x40, 0xA4, 0x90, 0x64, 0x00 }, // &
  23.   { 0xC0, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00 }, // '
  24.   { 0x20, 0x40, 0x80, 0x80, 0x40, 0x20, 0x00 }, // (
  25.   { 0x80, 0x40, 0x20, 0x20, 0x40, 0x80, 0x00 }, // )
  26.   { 0x00, 0x90, 0x60, 0xF0, 0x60, 0x90, 0x00 }, // *
  27.   { 0x00, 0x00, 0x40, 0xE0, 0x40, 0x00, 0x00 }, // +
  28.   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x80 }, // ,
  29.   { 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00 }, // -
  30.   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00 }, // .
  31.   { 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00 }, // /
  32.   { 0x60, 0x90, 0xB0, 0xD0, 0x90, 0x60, 0x00 }, // 0
  33.   { 0x40, 0xC0, 0x40, 0x40, 0x40, 0xE0, 0x00 }, // 1
  34.   { 0x60, 0x90, 0x10, 0x60, 0x80, 0xF0, 0x00 }, // 2
  35.   { 0xE0, 0x10, 0x60, 0x10, 0x10, 0xE0, 0x00 }, // 3
  36.   { 0x20, 0xA0, 0xA0, 0xF0, 0x20, 0x20, 0x00 }, // 4
  37.   { 0xF0, 0x80, 0xE0, 0x10, 0x10, 0xE0, 0x00 }, // 5
  38.   { 0x70, 0x80, 0xE0, 0x90, 0x90, 0x60, 0x00 }, // 6
  39.   { 0xF0, 0x10, 0x20, 0x40, 0x40, 0x40, 0x00 }, // 7
  40.   { 0x60, 0x90, 0x60, 0x90, 0x90, 0x60, 0x00 }, // 8
  41.   { 0x60, 0x90, 0x90, 0x70, 0x10, 0xE0, 0x00 }, // 9
  42.   { 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00 }, // :
  43.   { 0x00, 0x40, 0x00, 0x00, 0x40, 0x80, 0x00 }, // ;
  44.   { 0x00, 0x20, 0x40, 0x80, 0x40, 0x20, 0x00 }, // <
  45.   { 0x00, 0xE0, 0x00, 0x00, 0xE0, 0x00, 0x00 }, // =
  46.   { 0x00, 0x80, 0x40, 0x20, 0x40, 0x80, 0x00 }, // >
  47.   { 0x60, 0x90, 0x10, 0x60, 0x00, 0x40, 0x00 }, // ?
  48.   { 0x70, 0x88, 0xB8, 0xB0, 0x84, 0x78, 0x00 }, // @
  49.   { 0x60, 0x90, 0x90, 0xF0, 0x90, 0x90, 0x00 }, // A
  50.   { 0xE0, 0x90, 0xE0, 0x90, 0x90, 0xE0, 0x00 }, // B
  51.   { 0x60, 0x90, 0x80, 0x80, 0x90, 0x60, 0x00 }, // C
  52.   { 0xE0, 0x90, 0x90, 0x90, 0x90, 0xE0, 0x00 }, // D
  53.   { 0xF0, 0x80, 0xE0, 0x80, 0x80, 0xF0, 0x00 }, // E
  54.   { 0xF0, 0x80, 0xE0, 0x80, 0x80, 0x80, 0x00 }, // F
  55.   { 0x60, 0x90, 0x80, 0xB0, 0x90, 0x60, 0x00 }, // G
  56.   { 0x90, 0x90, 0xF0, 0x90, 0x90, 0x90, 0x00 }, // H
  57.   { 0xE0, 0x40, 0x40, 0x40, 0x40, 0xE0, 0x00 }, // I
  58.   { 0x70, 0x20, 0x20, 0x20, 0xA0, 0x40, 0x00 }, // J
  59.   { 0x90, 0xA0, 0xC0, 0xA0, 0x90, 0x90, 0x00 }, // K
  60.   { 0x80, 0x80, 0x80, 0x80, 0x80, 0xF0, 0x00 }, // L
  61.   { 0x88, 0xD8, 0xA8, 0x88, 0x88, 0x88, 0x00 }, // M
  62.   { 0x90, 0xD0, 0xB0, 0x90, 0x90, 0x90, 0x00 }, // N
  63.   { 0x60, 0x90, 0x90, 0x90, 0x90, 0x60, 0x00 }, // O
  64.   { 0xE0, 0x90, 0x90, 0xE0, 0x80, 0x80, 0x00 }, // P
  65.   { 0x70, 0x88, 0x88, 0x88, 0x90, 0x68, 0x00 }, // Q
  66.   { 0xE0, 0x90, 0x90, 0xE0, 0x90, 0x90, 0x00 }, // R
  67.   { 0x70, 0x80, 0x60, 0x10, 0x10, 0xE0, 0x00 }, // S
  68.   { 0xE0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00 }, // T
  69.   { 0x90, 0x90, 0x90, 0x90, 0x90, 0x60, 0x00 }, // U
  70.   { 0x88, 0x88, 0x88, 0x88, 0x50, 0x20, 0x00 }, // V
  71.   { 0x88, 0x88, 0x88, 0xA8, 0xD8, 0x88, 0x00 }, // W
  72.   { 0x88, 0x50, 0x20, 0x50, 0x88, 0x88, 0x00 }, // X
  73.   { 0x88, 0x88, 0x50, 0x20, 0x20, 0x20, 0x00 }, // Y
  74.   { 0xF0, 0x10, 0x20, 0x40, 0x80, 0xF0, 0x00 }, // Z
  75.   { 0xE0, 0x80, 0x80, 0x80, 0x80, 0xE0, 0x00 }, // [
  76.   { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x00 }, // \
  77.   { 0xE0, 0x20, 0x20, 0x20, 0x20, 0xE0, 0x00 }, // ]
  78.   { 0x40, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00 }, // ^
  79.   { 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00 }, // _
  80.   { 0xC0, 0x80, 0x40, 0x00, 0x00, 0x00, 0x00 }, // `
  81.   { 0x00, 0x00, 0x70, 0x90, 0x90, 0x70, 0x00 }, // a
  82.   { 0x80, 0x80, 0xE0, 0x90, 0x90, 0xE0, 0x00 }, // b
  83.   { 0x00, 0x00, 0x70, 0x80, 0x80, 0x70, 0x00 }, // c
  84.   { 0x10, 0x10, 0x70, 0x90, 0x90, 0x70, 0x00 }, // d
  85.   { 0x00, 0x00, 0x70, 0xA0, 0xC0, 0x70, 0x00 }, // e
  86.   { 0x30, 0x40, 0xE0, 0x40, 0x40, 0x40, 0x00 }, // f
  87.   { 0x00, 0x00, 0x60, 0x90, 0x70, 0x10, 0xE0 }, // g
  88.   { 0x80, 0x80, 0xE0, 0x90, 0x90, 0x90, 0x00 }, // h
  89.   { 0x00, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00 }, // i
  90.   { 0x00, 0x20, 0x00, 0x20, 0x20, 0x20, 0xC0 }, // j
  91.   { 0x80, 0x80, 0xA0, 0xC0, 0xA0, 0x90, 0x00 }, // k
  92.   { 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00 }, // l
  93.   { 0x00, 0x00, 0xD0, 0xA8, 0xA8, 0xA8, 0x00 }, // m
  94.   { 0x00, 0x00, 0xE0, 0x90, 0x90, 0x90, 0x00 }, // n
  95.   { 0x00, 0x00, 0x60, 0x90, 0x90, 0x60, 0x00 }, // o
  96.   { 0x00, 0x00, 0xE0, 0x90, 0x90, 0xE0, 0x80 }, // p
  97.   { 0x00, 0x00, 0x70, 0x90, 0x90, 0x70, 0x10 }, // q
  98.   { 0x00, 0x00, 0x60, 0x80, 0x80, 0x80, 0x00 }, // r
  99.   { 0x00, 0x00, 0x70, 0xC0, 0x30, 0xE0, 0x00 }, // s
  100.   { 0x00, 0x40, 0xE0, 0x40, 0x40, 0x40, 0x00 }, // t
  101.   { 0x00, 0x00, 0x90, 0x90, 0x90, 0x70, 0x00 }, // u
  102.   { 0x00, 0x00, 0x88, 0x88, 0x50, 0x20, 0x00 }, // v
  103.   { 0x00, 0x00, 0xA8, 0xA8, 0xA8, 0x58, 0x00 }, // w
  104.   { 0x00, 0x00, 0x90, 0x60, 0x60, 0x90, 0x00 }, // x
  105.   { 0x00, 0x00, 0x90, 0x90, 0x70, 0x10, 0xE0 }, // y
  106.   { 0x00, 0x00, 0xF0, 0x20, 0x40, 0xF0, 0x00 }, // z
  107.   { 0x10, 0x20, 0x20, 0xC0, 0x20, 0x20, 0x10 }, // {
  108.   { 0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0x00 }, // |
  109.   { 0x80, 0x40, 0x40, 0x30, 0x40, 0x40, 0x80 }, // }
  110.   { 0x64, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00 }, // ~
  111. };
  112.  
  113. int font_width[FONT_LETTERS] = {
  114.   3,2,4,7,4,7,6,3,4,4,5,4,3,4,2,7,  // Space thru slash
  115.   5,4,5,5,5,5,5,5,5,5, // 0 thru 9
  116.   2,3,4,4,4,5,7,  // Colon through at (@)
  117.   5,5,5,5,5,5,5,5,4,5,5,5,6,5,5,5,6,5,5,4,5,6,6,6,6,5, // Cap. letters
  118.   4,7,4,4,5,3,  // Right square bracket [ thru open quote (`)
  119.   5,5,5,5,5,5,5,5,2,4,5,2,6,5,5,5,5,4,5,4,5,6,6,5,5,5, // Lowercase ltrs
  120.   5,2,5,7  // Left sqiggle, broken bar, right squiggle, tilde
  121. };
  122.  
  123. void text(int x, int y, char * str)
  124. {
  125.   while(*str) {
  126.     print_letter(x, y, *str);
  127.     x += font_width[*str-32];
  128.     ++str;
  129.   }
  130. }
  131.  
  132. void print_letter(int x, int y, char letter)
  133. {
  134.   static int y_scan, width;
  135.   static unsigned char far * pix;
  136.   static unsigned char mask;
  137.   static unsigned char * fontptr;
  138.   register int x_scan;
  139.   if(letter <= 31) return;
  140.   letter -= 32;
  141.   pix = (unsigned char far *)0xA0000000+(y*320)+x;
  142.   width = font_width[(int)letter];
  143.   fontptr = font[(int)letter];
  144.   for(y_scan = 0; y_scan != 7; y_scan++) {
  145.     mask = 128;
  146.     for(x_scan = 0; x_scan != width; x_scan++) {
  147.       if(*fontptr & mask) *pix = 15; // White (black background)
  148.         else *pix = 0; // Black
  149.       mask >>= 1;
  150.       ++pix;
  151.     }
  152.     ++fontptr;
  153.     pix += (320-width);
  154.   }
  155. }
  156.  
  157.